
# import os, re
# import os, re, shutil
import shutil, os, re, logging, sys
import PyPDF2 as pp
# import os, re
import pandas as pd
import py7zr, rarfile
import os, zipfile

#%%使用ffmpeg将视频转为h265

import subprocess, os, re

def process_video(input_video, output_video):
    # 组合 FFmpeg 命令
    command = [
        'ffmpeg',
        '-i', input_video,       # 输入视频
        # '-i', input_sub,         # 输入字幕文件
        
        '-map', '0:v',           # 保留视频流
        '-c:v', 'libx265',        # 关键：使用 H.265 编码视频流
        '-crf', '23',             # 控制视频质量（范围 0-51，默认 23）
        '-preset', 'medium',      # 平衡编码速度与压缩率（可选 ultrafast, fast, medium, slow）  
 
        
        '-map', '0:a',         # 保留音频流
        # '-map', '0:a:1',          # 保留第2个音频流（英语）
        '-c:a', 'copy',           # 直接复制音频流
        '-disposition:a:0', 'default',# 设置默认音频


        # '-c:v', 'copy',          # 直接复制视频流
        # '-map', '1:s',            # 添加字幕流
        # '-c:s', 'ass',           # 指定字幕编码为 ASS
        # '-metadata:s:s:0', 'language=chs',  # 设置字幕语言为中文
        # '-disposition:s:0', 'default',# 设置默认字幕

        output_video
    ]
    
    try:
        # 执行命令
        subprocess.run(command, check=True, text=True, stderr=subprocess.PIPE)
        print(f"处理成功！输出文件: {output_video}")
    except subprocess.CalledProcessError as e:
        print(f"处理失败！错误信息:\n{e.stderr}")

# 使用示例
if __name__ == "__main__":
    

    file_list_1 = [f for f in os.listdir('.') if re.match(r'^(?!\.).*\.(mp4|avi|wmv|mkv|flv)$', f, re.I) and os.path.isfile(f)]
    file_list_1.sort()
    # file_list_2 = [f for f in os.listdir('.') if f.endswith('.ass')]
    # file_list_2.sort()
    
    # # print(file_list_1)
    # # print(file_list_2)
    
    
    for i in range(len(file_list_1)):
        # print(file_list_1[i])
        input_video = file_list_1[i]
        output_video = file_list_1[i][:-4] + '_1.mkv' # 建议使用 MKV 容器
        process_video(input_video, output_video)
        
    print('全部完成!')


#%%使用ffmpeg删除音频,添加字幕

import subprocess, os

def process_video(input_video, input_sub, output_video):
    # 组合 FFmpeg 命令
    command = [
        'ffmpeg',
        '-i', input_video,       # 输入视频
        '-i', input_sub,         # 输入字幕文件
        '-map', '0:v',           # 保留视频流
        '-c:v', 'libx265',        # 关键：使用 H.265 编码视频流
        '-crf', '23',             # 控制视频质量（范围 0-51，默认 23）
        '-preset', 'medium',      # 平衡编码速度与压缩率（可选 ultrafast, fast, medium, slow）  
 
        
        '-map', '-0:a:0',         # 排除第1个音频流（俄语）
        '-map', '0:a:1',          # 保留第2个音频流（英语）
        '-c:a', 'copy',           # 直接复制音频流
        '-disposition:a:0', 'default',# 设置默认音频


        # '-c:v', 'copy',          # 直接复制视频流
        '-map', '1:s',            # 添加字幕流
        '-c:s', 'ass',           # 指定字幕编码为 ASS
        '-metadata:s:s:0', 'language=chs',  # 设置字幕语言为中文
        '-disposition:s:0', 'default',# 设置默认字幕

        output_video
    ]
    
    try:
        # 执行命令
        subprocess.run(command, check=True, text=True, stderr=subprocess.PIPE)
        print(f"处理成功！输出文件: {output_video}")
    except subprocess.CalledProcessError as e:
        print(f"处理失败！错误信息:\n{e.stderr}")

# 使用示例
if __name__ == "__main__":
    # input_video = "Star.Wars.Rebels.S01E01.Spark.Of.Rebellion.Pt.1.1080p.WEB-DL.Rus.Eng_TeamHD.mkv"
    # input_sub = "Star.Wars.Rebels.S01E01.1080p.BluRay.x264-YELLOWBiRD.ass"
    # output_video = "output.mkv"  # 建议使用 MKV 容器
    
    # process_video(input_video, input_sub, output_video)


    file_list_1 = [f for f in os.listdir('.') if f.endswith('.mkv')]
    file_list_1.sort()
    file_list_2 = [f for f in os.listdir('.') if f.endswith('.ass')]
    file_list_2.sort()
    
    # print(file_list_1)
    # print(file_list_2)
    
    
    for i in range(len(file_list_1)):
        # print(i)
        input_video = file_list_1[i]
        input_sub = file_list_2[i]
        output_video = file_list_1[i][:-4] + '_1.mkv' # 建议使用 MKV 容器
        process_video(input_video, input_sub, output_video)
        
    print('全部完成!')




#%%将子文件夹的flac文件装入list,显示采样率,采样深度,并写入文档

import os
from mutagen.flac import FLAC

def get_flac_files(directory):
    return [os.path.join(root, file) 
            for root, _, files in os.walk(directory) 
            for file in files if file.endswith('.flac')]

def get_flac_info(file_path):
    audio = FLAC(file_path)
    sample_rate = audio.info.sample_rate
    bits_per_sample = audio.info.bits_per_sample
    return sample_rate, bits_per_sample

def write_to_file(file_path, sample_rate, bits_per_sample):
    with open(file_path, 'w') as f:
        f.write(f"采样率: {sample_rate} Hz\n")
        f.write(f"采样深度: {bits_per_sample} bits\n")

if __name__ == "__main__":
    directory = "/home/jack/Music/待处理/待比较"  # 替换为你的文件夹路径
    output_file = "flac_info.txt"  # 输出文件名

    flac_files = get_flac_files(directory)

    with open(output_file, 'w') as f:
        for flac_file in flac_files:
            sample_rate, bits_per_sample = get_flac_info(flac_file)
            f.write(f"{flac_file}:\n")
            f.write(f"  采样率: {sample_rate} Hz\n")
            f.write(f"  采样深度: {bits_per_sample} bits\n\n")

    print(f"信息已写入 {output_file}")



#%%重命名,前4个字符,替换.

# 使用替换成空字符删除,更有一般性
# f = '05.One Love.flac'

file_list = [f for f in os.listdir('.') if f.endswith('.flac')]

for f in file_list:
    f_1, f_2 = f[:4], f[4:]
    
    f_1_new = f_1.replace('.', '_')
    
    # join 方法将列表中的字符串合并为一个字符串。
    # '' 是用来连接字符串的分隔符，这里为空字符串表示直接连接。
    os.rename(f, ''.join([f_1_new, f_2]))
    # print(f'{new_f}重命名完成')



#%%重命名,添加前缀

import os

file_list = [f for f in os.listdir('.') if f.endswith('.mp4')]

for f in file_list:
    new_f = '11'+f
    # print(new_f)
    os.rename(f, new_f)
    print(f'{new_f}重命名完成')



#%%重命名,删除前缀

# 使用替换成空字符删除,更有一般性


import os

file_list = [f for f in os.listdir('.') if f.endswith('.flac')]
# f_name = 'Blue【Best of Blue】01.All Rise.flac'
for f in file_list:
    new_f = f[18:]
    os.rename(f, new_f)
    print(f'{new_f}重命名完成')





#%%flac文件增加专辑,演唱者等信息,封面为可选

import subprocess
import os

def add_metadata_and_cover_to_flac(flac_file, album_title, artist_name, album_year, cover_image=None):
    # 创建临时输出文件名
    temp_file = 'temp.flac'
    
    # 构建 ffmpeg 命令
    command = [
        'ffmpeg', '-i', flac_file,
        '-c:a', 'copy',  # 复制音频流，不重新编码
        '-metadata', f'album={album_title}',
        '-metadata', f'artist={artist_name}',
        '-metadata', f'date={album_year}'
    ]
    
    # 如果封面图片文件存在，添加封面图片相关参数
    if cover_image and os.path.exists(cover_image):
        command.extend(['-i', cover_image, '-map', '0', '-map', '1', '-c:v', 'copy', '-disposition:v', 'attached_pic'])
    else:
        command.extend(['-map', '0'])
    
    command.append(temp_file)
    
    # 运行 ffmpeg 命令
    try:
        result = subprocess.run(command, check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
        print("ffmpeg stdout:", result.stdout)
        print("ffmpeg stderr:", result.stderr)
    except subprocess.CalledProcessError as e:
        print("ffmpeg stdout:", e.stdout)
        print("ffmpeg stderr:", e.stderr)
        raise e
    
    # 替换原始文件
    os.replace(temp_file, flac_file)



file_list = [f for f in os.listdir('.') if f.endswith('.flac')]

for f in file_list:
    flac_file = f  # 替换为你的 .flac 文件名
    album_title = "Silver Side Up"  # 替换为你的专辑名
    artist_name = 'Nickelback'  # 替换为你的艺术家名
    album_year = '2001'  # 替换为你的专辑年份
    
    
    # cover_image = 'cover.jpg'  # 替换为你的封面图片文件名
    # add_metadata_and_cover_to_flac(flac_file, album_title, artist_name, album_year, cover_image)
    
    
    add_metadata_and_cover_to_flac(flac_file, album_title, artist_name, album_year)









#%%cue分割flac
import os
import subprocess
import shutil

def split_flac_with_cue(cue_file):
    # 获取文件名和路径
    base_name = os.path.splitext(cue_file)[0]
    flac_file = base_name + '.flac'
    
    # 创建同名文件夹
    output_dir = base_name
    os.makedirs(output_dir, exist_ok=True)
    
    # 移动 cue 和 flac 文件到同名文件夹
    shutil.move(cue_file, output_dir)
    shutil.move(flac_file, output_dir)
    
    # 进入文件夹
    os.chdir(output_dir)
    
    # 使用 shntool 分割 flac 文件
    command = [
        'shntool', 'split', '-f', os.path.basename(cue_file), '-o', 'flac', '-t', '%n_%t', os.path.basename(flac_file)
    ]
    subprocess.run(command, check=True)
    
    # 删除原始 cue 和 flac 文件
    os.remove(cue_file)
    os.remove(flac_file)
    os.chdir('..')

# 使用示例
# cue_file = 'example.cue'  # 替换为你的 .cue 文件名
# split_flac_with_cue(cue_file)


# 使用示例
# cue_file = '1986.04- 再見理想.cue'  # 替换为你的 .cue 文件名
# split_flac_with_cue(cue_file)

file_list = [f for f in os.listdir('.') if f.endswith('.cue')]

for f in file_list:
    split_flac_with_cue(f)

# file_list
    


#%%解压rar


# 如何将密码作为可选参数?


import subprocess
import os

def extract_rar_to_current(file_path, password):
    """
    使用 unrar 解压带密码的 RAR 文件到当前文件夹。

    :param file_path: RAR 文件的路径
    :param password: 解压密码
    """
    try:
        # 获取当前文件夹路径
        destination = os.getcwd()

        # 构建解压命令
        command = [
            'unrar', 'x', '-p' + password, file_path, destination
        ]
        
        # 执行解压命令
        subprocess.run(command, check=True)
        print("解压成功！")
    except subprocess.CalledProcessError as e:
        print("解压失败：", e)
    except Exception as e:
        print("发生错误：", e)



# 示例用法
file_list = [f for f in os.listdir('.') if f.endswith('.rar')]

# file_list
password = 'shipengliang'

for f in file_list:
    extract_rar_to_current(f, password)

# file_path = '/path/to/your/file.rar'


# password = 'your_password'

# extract_rar_to_current(file_path, password)




#%% 将文件编码转为utf-8

# 部分繁体字会乱码

import os
import chardet

def convert_to_utf8(directory):
    for filename in os.listdir(directory):
        if filename.endswith('.cue'):
            file_path = os.path.join(directory, filename)
            
            # Detect file encoding
            with open(file_path, 'rb') as f:
                raw_data = f.read()
                result = chardet.detect(raw_data)
                encoding = result['encoding']
            
            # If not UTF-8, convert to UTF-8
            if encoding.lower() != 'utf-8':
                print(f"Converting {file_path} from {encoding} to UTF-8")
                try:
                    with open(file_path, 'r', encoding=encoding, errors='ignore') as f:
                        content = f.read()
                    with open(file_path, 'w', encoding='utf-8') as f:
                        f.write(content)
                except UnicodeDecodeError as e:
                    print(f"Error decoding {file_path}: {e}")
            else:
                print(f"Skipping {file_path}, already UTF-8")

# Set the directory path
directory = '/home/jack/Music/bb/无文件夹'
convert_to_utf8(directory)

#%%将文件夹内的ape转为flac

import os
import subprocess

def convert_ape_to_flac(ape_file):
    # 获取文件名和路径
    base_name = os.path.splitext(ape_file)[0]
    flac_file = base_name + '.flac'
    
    # 构建 ffmpeg 命令
    command = [
        'ffmpeg', '-i', ape_file, '-c:a', 'flac', flac_file
    ]
    
    # 运行 ffmpeg 命令
    subprocess.run(command, check=True)

# 使用示例
file_list = [f for f in os.listdir('.') if f.endswith('.ape')]


for f in file_list:
    convert_ape_to_flac(f)




#%%将文件夹内的wav转为flac

# 后续改成处理单个文件的函数,使用for循环


import os
import subprocess
import logging
from pathlib import Path

def convert_wav_to_flac(input_folder, delete_wav=True, compression_level=8):
    """
    将指定文件夹内的 .wav 文件转换为 .flac 并删除原文件
    :param input_folder: 要处理的文件夹路径
    :param delete_wav: 是否删除原始 .wav 文件
    :param compression_level: FLAC 压缩级别 (0-12)
    """
    # 配置日志
    logging.basicConfig(
        level=logging.INFO,
        format='%(asctime)s - %(levelname)s: %(message)s'
    )

    # 遍历文件夹
    for root, _, files in os.walk(input_folder):
        for file in files:
            if file.lower().endswith('.wav'):
                wav_path = Path(root) / file
                flac_path = wav_path.with_suffix('.flac')

                # 跳过已存在的 flac 文件
                if flac_path.exists():
                    logging.warning(f"Skipped: {flac_path} already exists")
                    continue

                # 构建 FFmpeg 命令
                cmd = [
                    'ffmpeg',
                    '-i', str(wav_path),        # 输入文件
                    '-c:a', 'flac',              # 编码为 FLAC
                    '-compression_level', str(compression_level),  # 压缩级别
                    '-loglevel', 'error',        # 仅显示错误信息
                    '-y',                        # 覆盖已存在文件
                    '-hide_banner',              # 隐藏 FFmpeg 横幅
                    str(flac_path)
                ]

                # 执行转换
                try:
                    logging.info(f"Converting: {wav_path} -> {flac_path}")
                    subprocess.run(cmd, check=True, capture_output=True, text=True)
                    
                    # 删除原始文件（可选）
                    if delete_wav:
                        wav_path.unlink()
                        logging.info(f"Deleted: {wav_path}")
                        
                except subprocess.CalledProcessError as e:
                    logging.error(f"Failed to convert {wav_path}: {e.stderr}")
                except Exception as e:
                    logging.error(f"Error processing {wav_path}: {str(e)}")

if __name__ == '__main__':
    # 使用示例
    target_folder = '/home/jack/Music/bb/无文件夹'  # 修改为实际路径
    convert_wav_to_flac(target_folder, delete_wav=True, compression_level=8)

#%%将所有文件夹权限改为666

# 后续改成处理单个文件的函数,使用for循环

import os

def set_read_write_permissions(base_dir):
    # 遍历 base_dir 的子文件夹和文件
    for root, dirs, files in os.walk(base_dir):
        for file in files:
            # 获取文件的完整路径
            file_path = os.path.join(root, file)
            
            # 设置文件为可读写
            os.chmod(file_path, 0o666)
            print(f"Set read/write permissions for: {file_path}")

if __name__ == "__main__":
    # 设置目标文件夹路径
    base_directory = input("请输入目标文件夹路径: ").strip()
    
    if os.path.isdir(base_directory):
        set_read_write_permissions(base_directory)
        print("操作完成！")
    else:
        print("输入的路径无效，请检查后重试。")



#%%将文件夹中所有文件后缀名改为小写

import os

def rename_extensions_to_lowercase(base_dir):
    # 遍历 base_dir 的子文件夹和文件
    for root, dirs, files in os.walk(base_dir):
        for file in files:
            # 获取文件的完整路径
            file_path = os.path.join(root, file)
            
            # 分离文件名和扩展名
            file_name, file_ext = os.path.splitext(file)
            
            # 构造新的文件名（后缀改为小写）
            new_file_name = f"{file_name}{file_ext.lower()}"
            new_file_path = os.path.join(root, new_file_name)
            
            # 重命名文件
            os.rename(file_path, new_file_path)
            print(f"Renamed: {file_path} -> {new_file_path}")

if __name__ == "__main__":
    # 设置目标文件夹路径
    base_directory = input("请输入目标文件夹路径: ").strip()
    
    if os.path.isdir(base_directory):
        rename_extensions_to_lowercase(base_directory)
        print("操作完成！")
    else:
        print("输入的路径无效，请检查后重试。")

#%% 重命名文件夹中的.cue .ape .flac,并移到上一层目录

# 后续改成处理单个文件的函数,使用for循环

import os
import shutil

def rename_and_move_files(base_dir):
    # 遍历 base_dir 的子文件夹
    for root, dirs, files in os.walk(base_dir):
        # 获取当前文件夹名称
        folder_name = os.path.basename(root)

        # 统计 .cue 文件的数量
        cue_files = [file for file in files if file.endswith('.cue')]

        # 如果 .cue 文件超过一个，跳过此文件夹
        if len(cue_files) > 1:
            print(f"跳过文件夹 {folder_name}：包含多个 .cue 文件")
            continue
        
        # 遍历当前文件夹中的文件
        for file in files:
            # 检查文件扩展名是否为目标类型
            if file.endswith(('.cue', '.ape', '.flac', '.wav')):
                # 获取文件的完整路径
                file_path = os.path.join(root, file)
                
                # 构造新的文件名，保留后缀
                new_file_name = f"{folder_name}{os.path.splitext(file)[1]}"
                
                # 构造新的完整路径（移动到上层文件夹）
                new_file_path = os.path.join(os.path.dirname(root), new_file_name)
                
                # 重命名并移动文件
                shutil.move(file_path, new_file_path)
                print(f"Moved: {file_path} -> {new_file_path}")

if __name__ == "__main__":
    # 设置目标文件夹路径
    base_directory = input("请输入目标文件夹路径: ").strip()
    
    if os.path.isdir(base_directory):
        rename_and_move_files(base_directory)
        print("操作完成！")
    else:
        print("输入的路径无效，请检查后重试。")


#%%将文件夹中的文件名存入list


# 使用一句代码就行了
# file_list = [f for f in os.listdir('.') if f.endswith('.cue')]



import os

def get_file_names(directory):
    # 获取指定目录下的所有文件名
    file_names = []
    for file in os.listdir(directory):
        if os.path.isfile(os.path.join(directory, file)):
            file_names.append(file)
            
    file_names.sort()
    return file_names

# 使用示例
directory_path = '/home/jack/covers/2d'
file_list = get_file_names(directory_path)

# print(file_list)


# 删除文件后缀
file_list_2 = []

for f in file_list:
    p = f.split('.')
    file_list_2.append(p[0])
    
file_list_2.sort()
# print(file_list_2)


# 将文件名改为4个字符
file_list_3 = []

for f in file_list_2:
    if len(f) > 4:
        p = f[:4]
        file_list_3.append(p)
        
file_list_3.sort()
print(file_list_3)
len(file_list),len(file_list_3)




# 假设的文件名列表
# list_a = ["file1.txt", "file2.txt", "file3.txt"]
# list_b = ["new_name1.txt", "new_name2.txt", "new_name3.txt"]

# # 确保两个列表长度相同
# if len(file_list) != len(file_list_3):
#     raise ValueError("两个列表的长度必须相同")

# # 目录路径
# directory = "/path/to/your/files"

# # 重命名文件
# for old_name, new_name in zip(file_list, file_list_3):
#     if old_name == new_name:
#         print(f"跳过: {old_name} 与 {new_name} 相同")
#     continue
#     old_path = os.path.join(directory, old_name)
#     new_path = os.path.join(directory, new_name)
#     os.rename(old_path, new_path)
#     print(f"重命名: {old_name} -> {new_name}")

        



#%%shell命令,将flv转mp4

    # import os, re
path = '/Volumes/public/tutorial_video/张飞/硬件设计与开发第07部'
os.chdir(path)
for f in os.listdir('.'):
    if re.match('.*?flv', f):
        f_a = f.split('.')[0] + '.mp4'
        os.system(f'ffmpeg -i {f} -c copy {f_a}')


#%%解压7z，带密码

# 解压 到所在目录，注释代码为解压到单独目录

import os
import py7zr

directory_path = '/home/jack/smb_share'
password = 'www.comicbackup.com'

for file_name in os.listdir(directory_path):
    if file_name.endswith('.7z'):
        file_path = os.path.join(directory_path, file_name)
        with py7zr.SevenZipFile(file_path, mode='r', password=password) as archive:
            # output_directory = os.path.join(directory_path, file_name[:-3])  # 去掉 .7z 后缀
            # os.makedirs(output_directory, exist_ok=True)
            archive.extractall(path=directory_path)
        print(f'Extracted: {file_name} to {directory_path}')


#%%将文件名中的.替换为_

# import os, re, shutil
_path = '/Users/earlshaw/Desktop/python_video'
os.chdir(_path)
_a_files = []
for _f in os.listdir('.'):
    if re.match('.*?avi', _f):
        # 将文件名（不包括扩展名）中的所有.替换为_
        f_1 = re.sub('\\.', '_', _f[:-4])
        shutil.move(_f, f_1 + '.avi')



#%%shell命令.avi转.mp4

"""
特殊视频
提取.avi中的音频，视频
将视频转码
打包入mp4
"""
# import os, re
_path = '/Users/earlshaw/Desktop/test'
os.chdir(_path)
_a_files = []
for _f in os.listdir('.'):
    if re.match('.*?avi', _f):
        _a_files.append(_f)
_a_files.sort()
_a_files
for _f in _a_files:
    os.system(f"ffmpeg -i '{_f}' -vn -acodec copy aa.wav")
    os.system(f'ffmpeg -i aa.wav -acodec aac aa.aac')
    os.remove('aa.wav')
    os.system(f"ffmpeg -i '{_f}' -c:v copy -an aa.mp4")
    os.remove(_f)
    os.system(f"ffmpeg -i aa.mp4 -i aa.aac -c copy -map 0:v:0 -map 1:a:0 '{_f.split('.')[0] + '.mp4'}'")
    os.remove('aa.aac')
    os.remove('aa.mp4')
    print(f'{_f} done')



#%%文件名错位
def __(dirpath, os, shutil):
    """
    文件名依次向前错位
    批量重命名纠正
    """
    # import shutil
    for _root, _dirs, _files in os.walk(dirpath):
        files_n = _files.copy()
        files_n.insert(0, 'aa')
        del files_n[-1]
        print(_files, len(_files))
        print(files_n, len(files_n))
        _i = 0
        for _file in _files:
            shutil.move(os.path.join(_root, _file), os.path.join(_root, files_n[_i]))
            _i = _i + 1
        print('done')
    return files_n,


#%%漫画图片重命名
def __(logging, os, shutil):
    """
    漫画重命名
    使用正则，将文件名拆分，重组
    """
    # import shutil, os, re, logging
    logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')
    logging.disable(logging.CRITICAL)
    os.chdir('g:/教头当家 - Copy')
    txt_p = re.compile('^(\\d{3})_          # 开头3位数字\n                    ((0|1|2)?\\d)卷        # 中间2位数字，第一位为0或1或2或3\n                    (.*?)$                 # 结尾\n                    ', _re.VERBOSE)
    logging.debug(os.listdir('.'))
    for _f_name in os.listdir('.'):
        mo = txt_p.search(_f_name)
        logging.debug(mo)
        logging.debug(mo.group(1))
        logging.debug(mo.group(2))
        logging.debug(mo.group(3))
        logging.debug(mo.group(4))
        if mo == None:
            continue
        pre_p = '教头当家_vol'
        m_p = mo.group(2)
        sub_p = mo.group(4)
        f_new = f'{pre_p}{m_p}{sub_p}'
        abs_dir = os.path.abspath('.')
        amer_f = os.path.join(abs_dir, _f_name)
        euro_f = os.path.join(abs_dir, f_new)
        logging.debug(f'rename {amer_f} to {euro_f}...')
        shutil.move(amer_f, euro_f)
    return abs_dir, amer_f, euro_f, f_new, m_p, mo, pre_p, sub_p, txt_p


#%%列出文件夹中的所有文件
def __(os):
    '''
    列出文件夹中的所有文件
    '''


    # import re, os, sys
    _path = '/Users/earlshaw/Desktop/fc/fc roms/fc'
    os.chdir(_path)
    for _root, _dirs, _files in os.walk(_path):
        print(_files)
    return


#%%mp41重命名为mp4




# import os, re


_path = '/Volumes/Untitled/魔神英雄传1080P修复'
appe_name = '.*mp41'
new_appe_name = '.mp4'


_path = 'C:/Users/earls/Downloads/236 个 DLC'
appe_name = '.*pdf'
new_appe_name = '.pkg'



os.chdir(_path)
_pdf_files = []
for _f in os.listdir('.'):
    if re.match(appe_name, _f):
        _pdf_files.append(_f)
_pdf_files.sort(key=str.lower)
print(_pdf_files)
print(len(_pdf_files))


for _f_name in _pdf_files:
    _root, ext = os.path.splitext(_f_name)
    new_file_name = _root + new_appe_name
    os.rename(_f_name, new_file_name)
print('done!')
#%%mp41重命名为mp4优化
import os
import re

# 设置路径和文件名模式
_path = 'C:/Users/earls/Downloads/236 个 DLC'
appe_name = r'.*\.pdf'  # 使用原始字符串以避免转义问题
new_appe_name = '.pkg'

# 切换到目标目录
os.chdir(_path)

# 获取符合条件的 PDF 文件
_pdf_files = [f for f in os.listdir('.') if re.match(appe_name, f)]
_pdf_files.sort(key=str.lower)

# 输出文件列表和数量
print(_pdf_files)
print(len(_pdf_files))

# 重命名文件
for _f_name in _pdf_files:
    new_file_name = os.path.splitext(_f_name)[0] + new_appe_name
    os.rename(_f_name, new_file_name)

print('done!')



#%%解压zip
def __(os):
    '''
    解压文件夹中的所有zip，每100个打印一次
    '''



    # import os, re
    _path = '/Users/earlshaw/Downloads/sfc_rom'
    os.chdir(_path)
    _i = 0
    for _f in os.listdir('.'):
        if re.match('.*zip', _f):
            os.system(f'unzip "{_f}" -d .')
            _i = _i + 1
        if _i % 100 == 0:
            print(f'{_i} done!')
    return


#%%移动目录及子目录中的.mp4
    '''
    将目录及其子目录中的.mp4移动到，最外面的目录中
    '''



    import os, re, shutil
    _path = '/home/jack/Videos/nx 二次开发KF'
    # os.chdir(_path)
    for _root, _dirs, _files in os.walk(_path):
        for _f in _files:
            # re已经看不懂了，后续加注释
            # if re.match('.*\\(1\\).mp4', _f):
            if _f.endswith('.mp4'):
                _a = _root + os.sep + _f
                shutil.move(_a, '.')



#%%移动目录及子目录中的.zip
def __(os, shutil):
    '''
    将目录及其子目录中的.zip移动到，最外面的目录中
    '''

    # import os, re, shutil
    _path = '/Users/earlshaw/Downloads/gba'
    _re_part = '.*zip'
    os.chdir(_path)
    _i = 0
    for _root, _dirs, _files in os.walk(_path):
        for _f in _files:
            if re.match(_re_part, _f):
                _a = _root + os.sep + _f
                shutil.move(_a, '.')
    return


#%%移动目录及子目录中的.nes
def __(os, shutil):
    '''
    将目录及其子目录中的.nes移动到，最外面的目录中
    '''


    # import os, re, shutil
    _path = '/Users/earlshaw/Downloads/fc'
    _re_part = '.*nes'
    os.chdir(_path)
    for _root, _dirs, _files in os.walk(_path):
        for _f in _files:
            
            if re.match(_re_part, _f):
                # 如果当前目录中有.nes文件则跳过
                if os.path.exists(_f):
                    continue
                # 否则，文件在子目录中，将它移动到当前目录
                else:
                    _a = _root + os.sep + _f
                    shutil.move(_a, '.')
    return


#%%将mp4移动到目前所在文件夹
def __(os, shutil):
    '''
    将mp4移动到目前所在文件夹
    '''

    # import os, re, shutil
    _path = 'D:/vitrual_share/直播课32个python项目'
    os.chdir(_path)
    for _root, _dirs, _files in os.walk(_path):
        for _f in _files:
            if re.match('.*.mp4', _f):
                _a = _root + os.sep + _f
                shutil.move(_a, '.')
    return


#%%列出所有mp4的完整路径
def __(os):
    '''
    列出所有mp4的完整路径
    '''

    # import os, re, shutil
    _path = 'D:/vitrual_share/python_70'
    os.chdir(_path)
    for _root, _dirs, _files in os.walk(_path):
        for _f in _files:
            if re.match('.*.mp4', _f):
                _a = _root + os.sep + _f
                print(_a)
    return


#%%批量重命名文件夹内的mp4，貌似有问题
def __(os, shutil):
    '''
    批量重命名文件夹内的mp4，貌似有问题
    '''


    # import os, re
    _path = '/Volumes/public/aa/张飞/硬件设计与开发第05部'
    os.chdir(_path)
    cha = '_5-'
    mp4_files = []
    for _f in os.listdir('.'):
        if re.match('.*?mp4', _f):
            mp4_files.append(_f)
    for _f in mp4_files:
        if re.match('^\\d_', _f[13:]):
            _g = _f[:13] + '0' + _f[13:]
            mp4_files.remove(_f)
            mp4_files.append(_g)
    for _f in mp4_files:
        if re.match('^\\d_', _f[13:]):
            _g = _f[:13] + '0' + _f[13:]
            mp4_files.remove(_f)
            mp4_files.append(_g)
    mp4_files.sort()
    mp4_files
    for _f in mp4_files:
        _b = mp4_files.index(_f) + 1
        _a = 'lesson' + cha + str(_b) + '.mp4'
        print(_a)
        shutil.move(_f, _a)
    return cha, mp4_files


#%%列出.avi文件
def __(os):
    '''
    列出.avi文件
    '''

    # import os, re, shutil
    _path = '/Volumes/public/aa/python视频/python_3'
    os.chdir(_path)
    _a_files = []
    for _f in os.listdir('.'):
        if re.match('.*avi', _f):
            _a_files.append(_f)
    _a_files
    return


#%%将.sfc文件名写入txt文档
def __(os):
    '''
    将.sfc文件名写入txt文档
    '''

    # import os, re
    _path = '/Users/earlshaw/Downloads/roms/sfc_rom'
    _re_part = '.*(bin|sfc)'
    os.chdir(_path)
    _a_files = []
    with open('index.txt', 'w') as _f:
        for _g in os.listdir('.'):
            if re.match(_re_part, _g):
                _a_files.append(_g)
        _a_files.sort()
    with open('index.txt', 'w') as _f:
        for _i in range(len(_a_files)):
            _f.writelines(_a_files[_i] + '\n')
    return


#%%解压目录内的7z，rar，zip等文件
def __(
    destination_folder,
    os,
    py7zr,
    rarfile,
    shutil,
    source_folder,
    zipfile,
):
    """
    解压目录内的7z，rar，zip等文件
    """
    # import os, py7zr, shutil, rarfile
    _folder_path = 'path_to_folder'
    if not os.path.exists(destination_folder):
        os.makedirs(destination_folder)
    _files = os.listdir(_folder_path)
    for _file in _files:
        if _file.endswith('.rar'):
            rf = rarfile.RarFile(os.path.join(_folder_path, _file))
            rf.extractall(path='path_to_extract_folder')
            rf.close()
            source_file = os.path.join(source_folder, _file)
            destination_file = os.path.join(destination_folder, _file)
            shutil.move(source_file, destination_file)
        elif _file.endswith('.7z'):
            archive = py7zr.SevenZipFile(os.path.join(_folder_path, _file), mode='r')
            archive.extractall(path='path_to_extract_folder')
            archive.close()
            source_file = os.path.join(source_folder, _file)
            destination_file = os.path.join(destination_folder, _file)
            shutil.move(source_file, destination_file)
        elif _file.endswith('.zip'):
            with zipfile.ZipFile(os.path.join(_folder_path, _file), 'r') as zip_ref:
                zip_ref.extractall(path='path_to_extract_folder')
            source_file = os.path.join(source_folder, _file)
            destination_file = os.path.join(destination_folder, _file)
            shutil.move(source_file, destination_file)
    print('解压完成')
    return archive, destination_file, rf, source_file, zip_ref


#%%目录内文件夹转为zip

"""
目录内文件夹转为zip
"""
import os, zipfile

class FolderZipper:

    def __init__(self, folder_path):
        self.folder_path = folder_path

    def zip_folder(self, folder_path):
        zip_path = f'{folder_path}.zip'
        with zipfile.ZipFile(zip_path, 'w', zipfile.ZIP_DEFLATED) as zipf:
            for _root, _, _files in os.walk(folder_path):
                for _file in _files:
                    file_path = os.path.join(_root, _file)
                    archive_name = os.path.relpath(file_path, self.folder_path)
                    zipf.write(file_path, archive_name)
        print(f'{zip_path}压缩完成')

    def compress_folders_in_directory(self):
        for _root, _dirs, _ in os.walk(self.folder_path):
            for dir_name in _dirs:
                _folder_path = os.path.join(_root, dir_name)
                self.zip_folder(_folder_path)
                
#directory_path = '/Users/earlshaw/Downloads/漫画'
directory_path = '/home/jack/smb_share'
folder_zipper = FolderZipper(directory_path)
folder_zipper.compress_folders_in_directory()



#%%将文件夹中的子文件夹名写入文档

"""
将文件夹中的子文件夹名写入文档
"""
# import os
_folder_path = '/Volumes/comic/download'
subfolders = [_f.name for _f in os.scandir(_folder_path) if _f.is_dir()]
output_file = 'output.txt'
with open(output_file, 'w') as _file:
    for subfolder in subfolders:
        _file.write(subfolder + '\n')
print('子文件夹名已写入文档:', output_file)


#%%比较2个文件夹

import os

def compare_folders(folder1, folder2):
    files_set1 = set()
    files_set2 = set()

    # 获取文件夹1中的所有文件路径
    for foldername, subfolders, filenames in os.walk(folder1):
        for filename in filenames:
            files_set1.add(os.path.relpath(os.path.join(foldername, filename), folder1))

    # 获取文件夹2中的所有文件路径
    for foldername, subfolders, filenames in os.walk(folder2):
        for filename in filenames:
            files_set2.add(os.path.relpath(os.path.join(foldername, filename), folder2))

    # 找到文件夹1中存在但文件夹2中不存在的文件
    diff_files1 = files_set1 - files_set2

    # 找到文件夹2中存在但文件夹1中不存在的文件
    diff_files2 = files_set2 - files_set1

    return diff_files1, diff_files2

folder1 = 'Z:/virtual_share/calibre_lib'
folder2 = 'Z:/virtual_share/calibre_lib_2'

diff_files1, diff_files2 = compare_folders(folder1, folder2)

# 增加格式看起来清晰
print("Files in folder1 but not in folder2:")
for i in diff_files1:
    print(i)
print()
print("Files in folder2 but not in folder1:")
for i in diff_files2:
    print(i)

